package info.motteke.mixivoice4j.http.json.comment.get;

import info.motteke.mixivoice4j.Entry;
import info.motteke.mixivoice4j.http.json.JsonRequestBuilder;

/**
 * コメントを取得するJSONリクエストを構築するクラスです。
 *
 * @author Y.Wakamatsu
 *
 */
public class GetCommentBuilder extends JsonRequestBuilder<GetCommentRequest> {

    /** コメントを取得する対象のつぶやき。 */
    private Entry entry = null;

    /** 操作するユーザのキー。 */
    private String postKey = null;

    /** コメントを取得する数。 */
    private int limitRows = 20;

    /** コメントの取得を開始するインデックス。 */
    private int limitStart = 0;

    protected GetCommentBuilder() {
    }

    /**
     * コメントを取得する対象のつぶやきを設定します。
     */
    public GetCommentBuilder entry(Entry entry) {
        check(entry, "entry");
        this.entry = entry;
        return this;
    }

    /**
     * ユーザの操作用キーを設定します。
     */
    public GetCommentBuilder postKey(String postKey) {
        check(postKey, "postKey");
        this.postKey = postKey;
        return this;
    }

    /**
     * 取得するコメントの数を設定します。
     */
    public GetCommentBuilder limitRows(int limitRows) {
        if(limitRows < 0){
            throw new IllegalArgumentException("limitRowsは負に出来ません。 : " + limitRows);
        }
        this.limitRows = limitRows;
        return this;
    }

    /**
     * 取得を開始するインデックスを設定します。
     * 0が開始です。
     */
    public GetCommentBuilder limitStart(int limitStart) {
        if(limitStart < 0){
            throw new IllegalArgumentException("limitStartは負に出来ません。 : " + limitStart);
        }
        this.limitStart = limitStart;
        return this;
    }

    @Override
    public GetCommentRequest build(){
        check(entry, "entry");
        check(postKey, "postKey");

        GetCommentRequest c = new GetCommentRequest();
        GetCommentParam p = c.getParams();
        p.setEntryOwnerId(entry.getUser().getId());
        p.setEntryId(entry.getId());
        p.setPostKey(postKey);
        p.setLimitRows(limitRows);
        p.setLimitStart(limitStart);
        return c;
    }
}